package pkg

// pkg包下面的文件存放的时可公用的文件
// 配置文件读取

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"gopkg.in/yaml.v3"
	"io/ioutil"
)

// ShawConfig 具体的某一项
type ShawConfig struct {
	Name   string `yaml:"name"`
	Height int    `yaml:"height"`
	Age    int    `yaml:"age"`
}

type ServerConfig struct {
	Port string `yaml:"port"`
	Host string `yaml:"host"`
}

// Config 整体 对应到yaml文件里面的首项
type Config struct {
	ShawConfig   ShawConfig   `yaml:"shaw"`
	ServerConfig ServerConfig `yaml:"server"`
	//不序列化到fiber文件
	App *fiber.App `yaml:"-"`
}

// 读到的所有数据放在全局变量里面
// 即使当前没有暴露到外部的api但是整个程序初始化的时候都会调用一次init方法
var config *Config

func init() {
	configPath := "./config/config.yaml"
	ConfigFileBytes, err := ioutil.ReadFile(configPath)

	//exceptionHand 极为糟糕的异常处理出现一次异常需要处理一次异常
	if err != nil {
		//打印错误信息并结束程序
		panic(err)
	}
	config = &Config{}

	//decode bytes
	err = yaml.Unmarshal(ConfigFileBytes, config)
	if err != nil {
		panic(err.Error())
	}

	//头痛砍头，没有null的概念，一个实例化的属性都有一个默认值
	//if serverConfig.port == ""{
	//	panic("尚未配置端口号")
	//}

	fmt.Println(config.ServerConfig)
	fmt.Println(config.ShawConfig)
}

// 每个文件可以有多个init 函数，在包被初始化的时候被自动调用
func init() {
	fmt.Println("我被初始化了")
}

func GetConfig() *Config {
	return config
}
